//
//  ViewController.m
//  用NSUROSession实现断点续传
//
//  Created by apple on 15/9/8.
//  Copyright (c) 2015年 戴维营. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()<NSURLSessionDataDelegate>
{

    NSURLSession *_session;
    
    NSURLSessionDataTask *_task;
    
    NSString *_filePath;
    
    NSInteger _totalNumber;

    NSMutableData *_data;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
//  1、NSURLSessionTask对象需要通过NSURLSession创建；
    
//  2、NSURLSessionDataTask完成后，task对象拥有关联的服务器的响应数据；
    
//  3、NSURLSessionDownloadTask完成后，task对象拥有已经下载的文件的临时路径；
    
//  4、NSURLSessionUploadTask用于上传文件；
    _data = [NSMutableData data];
    
    _filePath = @"http://link.hhtjim.com/163/33162226.mp3";
    
//    创建一个临时的session配置［没有本地缓存，数据都存在内存中］
    
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration ephemeralSessionConfiguration];
    
    
    
//-----------------------------------------------------------------
    
    
//   config可以设置超时策略、HTTP头域等信息。
    
    config.timeoutIntervalForRequest = 60;//超时时间，单位／秒
    
//    设置头域
    config.HTTPAdditionalHeaders = @{@"header1":@"value1"};
    
    
// -----------------------------------------------------------------
    
    
    
    
//    使用上面创建的session配置创建一个session对象；
    
    _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    
//    调用方法请求数据［返回一个NSURLSessionTask对象，该对象后面会用到，比如开始暂停等操作］；
    
    
//    挂上NSURLSessionDataDelegate;
    
    _task = [_session dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:_filePath]]];
    
//    
    
    // Do any additional setup after loading the view, typically from a nib.
}

#pragma mark - 下载
- (IBAction)download:(UIButton *)sender
{
    //若当前task状态为挂起，则点击下载按钮开始进行任务［task创建默认为挂起状态］；
    
    if (_task.state == NSURLSessionTaskStateSuspended)
    {
        [_task resume];
    }
    
//      如果task为完成状态，此时点击下载按钮，重新创建task对象；
    
//      完成状态的task就算再次的运行，代理方法也不会调用，因此才需要重新创建task对象；
    
    if (_task.state == NSURLSessionTaskStateCompleted)
    {
        _task = [_session dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:_filePath]]];
        
        [_task resume];//task开始运行；
    }
    
}

#pragma mark - 暂停
- (IBAction)pause:(UIButton *)sender
{
    //判断当前task状态，如果正在运行，则触发暂停按钮调用suspend方法，挂起任务；
    if (_task.state == NSURLSessionTaskStateRunning)
    {
        [_task suspend];
    }
    
}

//1⃣️－－》开始接受响应［可以参照NSURLConnection代理方法］

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
    _totalNumber = response.expectedContentLength;//响应数据的总长度；
    
    NSLog(@"%ld",_totalNumber);
    
    NSHTTPURLResponse *tmpresponse = (NSHTTPURLResponse *)response;
    
//    如果响应成功，此时我们需要调用block方法，并传入枚举值NSURLSessionResponseAllow,意为准许继续加载［继续调用下面的方法］；
    
    if (tmpresponse.statusCode == 200)
    {
        completionHandler(NSURLSessionResponseAllow);
    }
}

//2⃣️－－》开始接受数据（持续的接收）

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
    NSLog(@"data-->%ld",data.length);
    
    [_data appendData:data];
    
    NSLog(@"%.2f%%",_data.length * 100.0 / _totalNumber);

}

//3⃣️－－》数据接受完成，也可能失败了，这里就需要判断了

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    NSLog(@"error-->%@",[error localizedDescription]);
    
//    如果调用了下面这个方法关闭session，下次再请求任务时需要重新创建session对象；
    
//    [_session finishTasksAndInvalidate];
    
    if (!error)
    {
        [_data writeToFile:@"/Users/apple/Desktop/123.mp3" atomically:YES];
        
        [_data setData:nil];//这里是什么意思？--->接受完成，清空字符串；
    }
}


#if 0

- (void)cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler;

//    如果NSURLSessionDownloadTask对象是通过上面的这种方法取消下载的，可以通过以下方法恢复下载；

- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData comletionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler NS_CLASS_AVAILABLE(NSURLSESSION_AVAILABLE, 7_0);
                                                                                                                                        
#endif

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
